package Top101K;

/**
 * @Author quan
 * @Description 盛水最多的容器
 * @Date 2023/11/16 10:21
 */
public class BM93_MaxArea {
    public static void main(String[] args) {
        int[] arr = {1,7,3,2,4,5,8,2,7};
        int res = maxArea(arr);
        System.out.println(res);
    }

    /**
     * 给定一个数组height，长度为n，每个数代表坐标轴中的一个点的高度，height[i]是在第i点的高度，请问，从中选2个高度与x轴组成的容器最多能容纳多少水
     * (1)当n小于2时，视为不能形成容器，请返回0
     * (2)数据保证能容纳最多的水不会超过整形范围，即不会超过2的31次方-1
     * @param height  [1,7,3,2,4,5,8,2,7]
     * @return 49
     */
    public static int maxArea (int[] height) {
        // write code here
        // (j-i)*Math.min(arr[i],arr[j])
        //边界条件
        if(height.length < 2){
            return 0;
        }
        //--------------运行超时---------------
//        int maxArea = Integer.MIN_VALUE;
//        int currentArea = 0;
//        for (int i = 0; i < height.length; i++) {
//            for (int j = i+1; j < height.length; j++) {
//                currentArea = (j-i)*Math.min(height[i],height[j]);
//                if(maxArea < currentArea){
//                    maxArea = currentArea;
//                }
//            }
//        }
        int maxArea = Integer.MIN_VALUE;
        int currentArea = 0;
        int left = 0;
        int right = height.length-1;
        while (left<right){
            //----------用while循环，关键要知道left和right指针移动的条件-------------------
            // if(height[left] < height[right])，left++
            // 依据贪心思想，每次指向较短边的指针向中间靠，另一指针不变
           if(height[left] < height[right]){
               currentArea = (right-left)*Math.min(height[left],height[right]);
               if(maxArea < currentArea){
                    maxArea = currentArea;
               }
               left++;
           }else{
               currentArea = (right-left)*Math.min(height[left],height[right]);
               if(maxArea < currentArea){
                   maxArea = currentArea;
               }
               right--;
           }
        }
        return maxArea;
    }
}
